/*
 * 书籍索引 - 书籍数据索引定义
 * 
 * 主要功能：
 * - 定义书籍数据的索引结构
 * - 提供书籍的数据库索引支持
 * - 实现书籍数据的快速查询
 * - 演示YesSql索引的使用
 */

using Lombiq.TrainingDemo.Models;
using YesSql.Indexes;

namespace Lombiq.TrainingDemo.Indexes;

/// <summary>
/// 书籍索引 - 定义书籍数据的索引结构
/// 
/// 主要用途：
/// - 定义书籍数据的索引结构
 //* - 提供书籍的数据库索引支持
 //* - 实现书籍数据的快速查询
 //* - 演示YesSql索引的使用
 //* 
 //* 使用场景：
/// - 为书籍数据提供数据库索引
/// - 支持按作者和标题进行快速查询
/// - 实现书籍数据的结构化存储
/// - 提供高效的书籍数据检索
/// 
/// 设计原因：
/// - 为书籍数据提供高效的查询支持
/// - 实现数据库级别的索引优化
/// - 支持复杂的书籍查询需求
/// - 提供可扩展的索引结构
/// 
/// 设计模式：
/// - 索引模式：继承MapIndex实现数据库索引
/// - 映射模式：使用IndexProvider实现数据映射
/// - 单例模式：IndexProvider注册为单例服务
/// - 提供程序模式：实现IndexProvider接口
/// </summary>
// BookIndex对象将存储在数据库中。由于这实际上是一个关系数据库，这些将是专门为此索引创建的表中的记录。
public class BookIndex : MapIndex
{
    /// <summary>
    /// 作者 - 书籍作者信息
    /// </summary>
    public string Author { get; set; }

    /// <summary>
    /// 标题 - 书籍标题信息
    /// </summary>
    public string Title { get; set; }
}

/// <summary>
/// 书籍索引提供程序 - 提供书籍对象和索引记录之间的映射
/// 
/// 主要用途：
/// - 提供书籍对象和索引记录之间的映射
 //* - 在保存Book对象时自动创建索引记录
 //* - 实现文档数据库和关系数据库之间的数据同步
 //* - 支持书籍数据的自动索引
 //* 
 //* 使用场景：
/// - 当Book对象保存时自动创建索引记录
/// - 维护书籍数据的索引一致性
/// - 支持书籍数据的快速查询
/// - 实现书籍数据的结构化存储
/// 
/// 设计原因：
/// - 实现文档数据库和关系数据库的集成
/// - 提供自动的索引维护机制
/// - 支持高效的书籍数据查询
/// - 简化索引管理的复杂性
/// 
/// 设计模式：
/// - 提供程序模式：继承IndexProvider<T>实现索引提供
/// - 映射模式：使用Map方法实现数据映射
/// - 单例模式：注册为单例服务以提高性能
/// - 自动模式：自动处理索引记录的创建和更新
/// </summary>
// 这些IndexProvider服务将提供存储在文档数据库中的对象与存储在记录中的索引对象之间的映射。
// 当Book对象通过ISession服务保存时，索引记录也将存储在相关的索引表中。不要忘记在服务提供程序中注册此类（请参阅：Startup.cs）。

// 注意，这个IndexProvider注册为单例，这通常是好的选择。但是，如果您想向其中注入其他服务
// （比如您到目前为止看到的任何基本Orchard服务），那么您需要使用AddScoped<IScopedIndexProvider, BookIndexProvider>()
// 注册它，并使类也实现IScopedIndexProvider。
public class BookIndexProvider : IndexProvider<Book>
{
    /// <summary>
    /// 描述方法 - 定义Book对象到BookIndex的映射
    /// 
    /// 功能说明：
    /// - 定义Book对象到BookIndex的映射关系
    /// - 指定要索引的字段（Author和Title）
    /// - 实现文档数据库到关系数据库的数据同步
    /// - 支持书籍数据的自动索引维护
    /// 
    /// 映射逻辑：
    /// - 将Book.Author映射到BookIndex.Author
    /// - 将Book.Title映射到BookIndex.Title
    /// - 自动处理索引记录的创建和更新
    /// </summary>
    /// <param name="context">描述上下文</param>
    public override void Describe(DescribeContext<Book> context) =>
        context.For<BookIndex>()
            .Map(book =>
                new BookIndex
                {
                    Author = book.Author,
                    Title = book.Title,
                });
}

// 下一站：Migrations/BookMigrations
